home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 681 / term / source.lha / LocaleSupport.c < prev    next >
C/C++ Source or Header  |  1992-05-09  |  6KB  |  355 lines

  1. /*
  2. **    $Id: LocaleSupport.c,v 1.6 92/05/01 12:52:31 olsen Sta Locker: olsen $
  3. **    $Revision: 1.6 $
  4. **    $Date: 92/05/01 12:52:31 $
  5. **
  6. **    Localization support routines
  7. **
  8. **    Copyright © 1990-1992 by Olaf `Olsen' Barthel & MXM
  9. **        All Rights Reserved
  10. */
  11.  
  12. #include "termGlobal.h"
  13.  
  14. extern struct
  15. {
  16.     LONG    as_ID;
  17.     STRPTR    as_Str;
  18. } AppStrings[];
  19.  
  20. extern LONG NumAppStrings;
  21.  
  22. struct LocaleBase    *LocaleBase;
  23. struct Catalog        *Catalog;
  24. struct Locale        *Locale;
  25.  
  26.     /* LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn):
  27.      *
  28.      *    Open string translation tables.
  29.      */
  30.  
  31. VOID __regargs
  32. LocaleOpen(STRPTR CatalogName,STRPTR BuiltIn,LONG Version)
  33. {
  34. #ifdef LIBRARIES_LOCALE_H
  35.     if(LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library",38))
  36.     {
  37.         if(LocaleBase -> lb_SysPatches)
  38.         {
  39.             strcpy(ConvNumber,"%lD");
  40.             strcpy(ConvNumber10,"%10lD");
  41.  
  42.             Catalog = OpenCatalog(NULL,CatalogName,
  43.                 OC_BuiltInLanguage,    BuiltIn,
  44.                 OC_BuiltInCodeSet,    0,
  45. /*                OC_Version,        Version,*/
  46.             TAG_DONE);
  47.  
  48.             Locale = OpenLocale(NULL);
  49.         }
  50.         else
  51.         {
  52.             strcpy(ConvNumber,"%ld");
  53.             strcpy(ConvNumber10,"%10ld");
  54.  
  55.             CloseLibrary(LocaleBase);
  56.  
  57.             LocaleBase = NULL;
  58.         }
  59.     }
  60.     else
  61.     {
  62.         strcpy(ConvNumber,"%ld");
  63.         strcpy(ConvNumber10,"%10ld");
  64.     }
  65. #else
  66.     strcpy(ConvNumber,"%ld");
  67.     strcpy(ConvNumber10,"%10ld");
  68. #endif    /* LIBRARIES_LOCALE_H */
  69. }
  70.  
  71.     /* LocaleClose():
  72.      *
  73.      *    Close the translation tables.
  74.      */
  75.  
  76. VOID
  77. LocaleClose()
  78. {
  79.     if(Locale)
  80.         CloseLocale(Locale);
  81.  
  82.     if(Catalog)
  83.         CloseCatalog(Catalog);
  84.  
  85.     if(LocaleBase)
  86.         CloseLibrary(LocaleBase);
  87. }
  88.  
  89.     /* LanguageCheck():
  90.      *
  91.      *    Checks to see if the currently selected language
  92.      *    is english.
  93.      */
  94.  
  95. VOID
  96. LanguageCheck()
  97. {
  98. #ifdef LIBRARIES_LOCALE_H
  99.     if(Locale && Catalog)
  100.     {
  101.         if(Locale -> loc_LanguageName)
  102.         {
  103.             if(!Stricmp(Locale -> loc_LanguageName,"english.language"))
  104.                 English = TRUE;
  105.             else
  106.                 English = FALSE;
  107.         }
  108.         else
  109.             English = FALSE;
  110.     }
  111.     else
  112.         English = TRUE;
  113. #else
  114.     English = TRUE;
  115. #endif    /* LIBRARIES_LOCALE_H */
  116. }
  117.  
  118.     /* GadToolsStrlen(STRPTR *String):
  119.      *
  120.      *    Custom version of strlen, useful for gadtools object titles
  121.      *    with embedded underscore characters.
  122.      */
  123.  
  124. WORD __regargs
  125. GadToolsStrlen(STRPTR String)
  126. {
  127.     WORD Len = 0;
  128.  
  129.     while(*String)
  130.     {
  131.         if(*String++ != '_')
  132.             Len++;
  133.     }
  134.  
  135.     return(Len);
  136. }
  137.  
  138.     /* GadToolsLongestString(WORD From,WORD To):
  139.      *
  140.      *    Determines the longest string used by a gadtools
  141.      *    control panel.
  142.      */
  143.  
  144. WORD __regargs
  145. GadToolsLongestString(WORD From,WORD To)
  146. {
  147.     STRPTR    Text;
  148.     WORD    MaxLen = 0,
  149.         Len,i;
  150.  
  151.     for(i = From ; i <= To ; i++)
  152.     {
  153.         if(Text = LocaleString(i))
  154.         {
  155.             if((Len = GadToolsStrlen(Text)) > MaxLen)
  156.                 MaxLen = Len;
  157.         }
  158.     }
  159.  
  160.     return(MaxLen);
  161. }
  162.  
  163.     /* SmallCurrency():
  164.      *
  165.      *    Support function for the rates control panel, returns a formatted
  166.      *    string to contain a string like "cents/unit".
  167.      */
  168.  
  169. STRPTR __regargs
  170. SmallCurrency()
  171. {
  172.     STATIC UBYTE Buffer[30];
  173.  
  174. #ifdef LIBRARIES_LOCALE_H
  175.     if(Locale)
  176.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),Locale -> loc_MonSmallCS);
  177.     else
  178.         SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
  179. #else
  180.     SPrintf(Buffer,LocaleString(MSG_RATEPANEL_PAY_PER_UNIT_GAD),"Pay");
  181. #endif    /* LIBRARIES_LOCALE_H */
  182.  
  183.     return(Buffer);
  184. }
  185.  
  186.     /* CreateSum(LONG Quantity):
  187.      *
  188.      *    Create a string containing a monetary quantity formatted
  189.      *    according to the current locale rules.
  190.      */
  191.  
  192. STRPTR __regargs
  193. CreateSum(LONG Quantity,BYTE UseCurrency)
  194. {
  195.     STATIC UBYTE Buffer[20];
  196.  
  197. #ifdef LIBRARIES_LOCALE_H
  198.     if(Locale)
  199.     {
  200.         if(Locale -> loc_MonFracDigits < 6)
  201.         {
  202.             STATIC LONG    Power[] = { 1, 10, 100, 1000, 10000, 100000 };
  203.  
  204.             UBYTE        Buffer2[20];
  205.             LONG        Int,
  206.                     Frac;
  207.  
  208.             if(UseCurrency)
  209.             {
  210.                 strcpy(Buffer2,"%s %lD%s%");
  211.  
  212.                 SPrintf(&Buffer2[9],"%02ld",Locale -> loc_MonFracDigits);
  213.  
  214.                 strcat(Buffer2,"lD");
  215.  
  216.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  217.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  218.  
  219.                 SPrintf(Buffer,Buffer2,Locale -> loc_MonCS,Int,Locale -> loc_MonDecimalPoint,Frac);
  220.             }
  221.             else
  222.             {
  223.                 STATIC UBYTE Buffer1[20];
  224.  
  225.                 strcpy(Buffer2,"%lD%s%");
  226.  
  227.                 SPrintf(&Buffer2[6],"%02ld",Locale -> loc_MonFracDigits);
  228.  
  229.                 strcat(Buffer2,"lD");
  230.  
  231.                 Int    = Quantity / Power[Locale -> loc_MonFracDigits];
  232.                 Frac    = Quantity % Power[Locale -> loc_MonFracDigits];
  233.  
  234.                 SPrintf(Buffer1,Buffer2,Int,Locale -> loc_MonDecimalPoint,Frac);
  235.  
  236.                 return(Buffer1);
  237.             }
  238.         }
  239.         else
  240.             SPrintf(Buffer,"%lD.%02ld",Quantity / 100,Quantity % 100);
  241.     }
  242.     else
  243.         SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
  244. #else
  245.     SPrintf(Buffer,"%ld.%02ld",Quantity / 100,Quantity % 100);
  246. #endif    /* LIBRARIES_LOCALE_H */
  247.  
  248.     return(Buffer);
  249. }
  250.  
  251.     /* LocalizeString(STRPTR *Strings,WORD From,WORD To):
  252.      *
  253.      *    Localize an array of strings.
  254.      */
  255.  
  256. VOID __regargs
  257. LocalizeString(STRPTR *Strings,WORD From,WORD To)
  258. {
  259.     WORD i,j;
  260.  
  261.     for(i = From, j = 0 ; i <= To ; i++)
  262.     {
  263.         if(!Strings[j])
  264.             Strings[j++] = LocaleString(i);
  265.     }
  266. }
  267.  
  268.     /* LocalizeMenu(struct NewMenu *Menu,WORD From):
  269.      *
  270.      *    Localize a NewMenu definition.
  271.      */
  272.  
  273. VOID __regargs
  274. LocalizeMenu(struct NewMenu *Menu,WORD From)
  275. {
  276.     STRPTR Label,Shortcut;
  277.  
  278.         while(Menu -> nm_Type != NM_END)
  279.     {
  280.         Shortcut = LocaleString(From);
  281.  
  282.         if(Shortcut[0] && !Shortcut[1])
  283.             Label = Shortcut + 2;
  284.         else
  285.         {
  286.             Label        = Shortcut;
  287.             Shortcut    = NULL;
  288.         }
  289.  
  290.         switch(Menu -> nm_Type)
  291.         {
  292.             case NM_TITLE:    Menu -> nm_Label = Label;
  293.  
  294.                     From++;
  295.  
  296.                     break;
  297.  
  298.             case NM_ITEM:
  299.             case NM_SUB:    if(Menu -> nm_Label != NM_BARLABEL)
  300.                     {
  301.                         Menu -> nm_Label    = Label;
  302.                         Menu -> nm_CommKey    = Shortcut;
  303.  
  304.                         From++;
  305.                     }
  306.  
  307.                     break;
  308.         }
  309.  
  310.         Menu++;
  311.     }
  312. }
  313.  
  314.     /* LocaleString(LONG ID):
  315.      *
  316.      *    Obtain a string from the translation pool.
  317.      */
  318.  
  319. STRPTR __regargs
  320. LocaleString(LONG ID)
  321. {
  322.     STRPTR Builtin;
  323.  
  324.     if(AppStrings[ID] . as_ID == ID)
  325.         Builtin = AppStrings[ID] . as_Str;
  326.     else
  327.     {
  328.         WORD i;
  329.  
  330.         Builtin = NULL;
  331.  
  332.         for(i = 0 ; i < NumAppStrings ; i++)
  333.         {
  334.             if(AppStrings[i] . as_ID == ID)
  335.             {
  336.                 Builtin = AppStrings[i] . as_Str;
  337.  
  338.                 break;
  339.             }
  340.         }
  341.     }
  342.  
  343.     if(Catalog)
  344.     {
  345.         STRPTR String = GetCatalogStr(Catalog,ID,Builtin);
  346.  
  347.         if(String[0])
  348.             return(String);
  349.         else
  350.             return(Builtin);
  351.     }
  352.     else
  353.         return(Builtin);
  354. }
  355.